MySQL字符集和校对规则

356次阅读
没有评论

共计 2570 个字符,预计需要花费 7 分钟才能阅读完成。

纯文本在计算机底层会转换为二进制保存,将字符转换为二进制码的过程,称为编码,将二进制码转换为字符的过程,称为解码。

字符集

编码和解码时所采用的规则,称为字符集。常见字符集有:ASCII、GBK、Unicode 等。编写程序时,如果发现程序代码出现乱码的情况,就要马上去检查字符集是否正确。

  • ASCII 字符集
    共收录 128 个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才 128 个字符,所以可使用 1 个字节来进行编码。
  • ISO 8859- 1 字符集
    共收录 256 个字符,是在 ASCII 字符集基础上又扩充了 128 个西欧常用字符,也可以使用 1 个字节来进行编码。这个字符集也有一个别名 latin1。
  • GB2312 字符集
    收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母,其中收录汉字 6763 个,其他文字符号 682 个。同时这种字符集又兼容 ASCII 字符集,所以在编码方式上显得有些奇怪:如果该字符在 ASCII 字符集中,则采用 1 字节编码,否则采用 2 字节编码。这种表示一个字符需要字节数可能不同的编码方式称为变长编码方式。如果某个字节是在 0~127 之内的,就意味着一个字节代表一个单独字符,否则就是两个字节代表一个单独字符。
  • GBK 字符集
    该字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312,包含了 2 万多个汉字等字符。
  • Unicode 字符集
    收录地球上能想到的所有字符,而且还在不断扩充,这种字符集兼容 ASCII 字符集。Unicode 字符集采用 UTF-8、UTF-16、UTF-32 这几种编码方案,UTF- 8 使用 1~4 个字节编码一个字符,UTF-16 使用 2 个或 4 个字节编码一个字符,UTF-32 使用 4 个字节编码一个字符。

    • UTF- 8 是 Unicode 字符集的一种编码方案,采用变长编码方式,编码一个字符需要使用 1~4 个字节。英文、数字等只占 1 个字节,汉字占用 3 个字节。
UTF- 8 编码方式(二进制)
0xxxxxxx(ASCII 码) 1 个字节
110xxxxx 10xxxxxx 2 个字节
1110xxxx 10xxxxxx 10xxxxxx 3 个字节
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 个字节

MySQL 支持字符集

MySQL 自己定义了两个概念:

  • utf8mb3:阉割过的 utf8 字符集,只使用 1~3 个字节表示字符
  • utf8mb4:正宗的 utf8 字符集,使用 1~4 个字节表示字符

在 MySQL 中 utf8 是 utf8mb3 的别名,这就意味着使用 1~3 个字节来表示一个字符,如果想使用 4 字节编码一个字符,比如存储一些 emoji 表情啥的,那请使用 utf8mb4。

查看字符集:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];

校对规则

查看命令:SHOW COLLATION [LIKE 匹配的模式];,一种字符集可能对应着若干种校对规则(排序规则)。

后缀 英文释义 描述
_ai accent insensitive 不区分重音
_as accent sensitive 区分重音
_ci case insensitive 不区分大小写
_cs case sensitive 区分大小写
_bin binary 以二进制方式比较

每种字符集都有一种默认的比较规则,比方说 utf8 字符集默认的比较规则就是utf8_general_ci。由于字符集和比较规则是互相有联系的,如果只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化。

MySQL 有 4 个级别的字符集和比较规则,分别是:

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别

服务器级别

MySQL 提供了两个系统变量来表示服务器级别的字符集和比较规则:

系统变量 描述
character_set_server 服务器级别的字符集
collation_server 服务器级别的比较规则

数据库级别

在创建和修改数据库时可指定该数据库的字符集和比较规则,具体语法如下:

CREATE DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称];

ALTER DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称];

如果创建数据库时不指定字符集和比较规则,则使用服务器级别的字符集和比较规则作为数据库的字符集和比较规则。

查看当前数据库使用的字符集和比较规则,可以查看下面两个系统变量的值(只读),前提是使用 USE 语句选择当前默认数据库,如果没有默认数据库,则变量与相应服务器级系统变量具有相同的值:

系统变量 描述
character_set_database 当前数据库的字符集
collation_database 当前数据库的比较规则

表级别

也可以在创建和修改表的时候指定表的字符集和比较规则,如果没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则。

列级别

对于存储字符串的列,同一个表中不同列也可以有不同的字符集和比较规则,如果没有指明字符集和比较规则,将使用该列所在表的字符集和比较规则作为该列的字符集和比较规则。

字符集转换

客户端从发送请求到返回结果这个过程中伴随着多次字符集的转换,在这个过程中会用到 3 个系统变量:

系统变量 描述
character_set_client 服务器解码请求时使用的字符集
character_set_connection 服务器处理请求时会把请求字符串从 character_set_client 转为 character_set_connection
character_set_results 服务器向客户端返回数据时使用的字符集

MySQL 字符集和校对规则

通常把这三个系统变量设置成和客户端使用的字符集一致,这样减少了很多无谓的字符集转换。为了方便我们设置,MySQL 提供了一条非常简便的语句:SET NAMES 字符集名;。

如果想在启动客户端时就把这三个系统变量的值设置成一样的,可指定一个叫 default-character-set 的启动选项,比如在配置文件里可以这么写:

[client]
default-character-set=utf8

它起到的效果和执行一遍 SET NAMES utf8; 是一样一样的,都会将那三个系统变量的值设置成 utf8。

正文完
 0
阿伯手记
版权声明:本站原创文章,由 阿伯手记 于2024-01-29发表,共计2570字。
转载说明:本站原创内容,除特殊说明外,均基于 CC BY-NC-SA 4.0 协议发布,转载须注明出处与链接。
评论(没有评论)
验证码

阿伯手记

阿伯手记
阿伯手记
喜欢编程,头发渐稀;成长路上,宝藏满地
文章数
767
评论数
207
阅读量
682868
今日一言
-「
热门文章
职场救急!AI请假话术生成器:1秒定制高通过率理由

职场救急!AI请假话术生成器:1秒定制高通过率理由

超级借口 不好开口?借口交给我!智能生成工作请假、上学请假、饭局爽约、约会拒绝、邀约推辞、万能借口等各种借口理...
夸克网盘快传助手提高非VIP下载速度

夸克网盘快传助手提高非VIP下载速度

夸克网盘限速这个大家都知道,不开会员差不多限速在几百 K。那有没有办法在合法合规途径加速下载夸克网盘呢?这里推...
TVAPP:开源电视盒子资源库,一键打造家庭影院

TVAPP:开源电视盒子资源库,一键打造家庭影院

导语 TVAPP 是一个专为 Android TV 电视盒子用户打造的开源影音资源库,集成了影视、直播、游戏等...
巴别英语:用美剧和TED演讲轻松提升英语听力与口语

巴别英语:用美剧和TED演讲轻松提升英语听力与口语

还在为枯燥的英语学习而烦恼吗?巴别英语通过创新的美剧学习模式,让英语学习变得生动有趣。平台提供海量美剧和 TE...
Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 是一款在线中文姓名生成器,可在几秒内生成符合个人需求的中文名字。...
2025年12月 每日精选

2025年12月 每日精选

关于每日精选栏目 发现一些不错的资源,点击 这里 快速投稿。 12 月 26 日 .ax 顶级域 目前全球唯一...
123云盘限时福利:登录即送1个月VIP尊享权益!

123云盘限时福利:登录即送1个月VIP尊享权益!

🎁  零成本体验 20T 超大空间与会员加速通道 🎉 活动亮点 登录即送:无需任何复杂操作,登录账号直接领取 ...
最新评论
阿伯手记 阿伯手记 发了:https://aboss.top/moments/1064
吴蛋蛋 吴蛋蛋 快发小年快乐
吴蛋蛋 吴蛋蛋 Ask4Me,这个之前看server酱接入了
15220202929 15220202929 怎么用
八对 八对 麻烦大佬更新下【堆新】的友链站名:八对星星描述:极目星视穹苍无界•足履行者大地有疆链接:https://8dui.com图标:https://cf.8dui.com/logo.webp横标:https://cf.8dui.com/logo-w.webp订阅:https://8dui.com/rss.xml
三毛笔记 三毛笔记 已添加
DUINEW DUINEW 已添加贵站,期待贵站友链~博客名称:堆新博客地址:https://duinew.com/博客描述:堆新堆新,引力向新!——堆新(DUINEW)博客头像:https://d.duinew.com/logo.webp横版头像:https://d.duinew.com/logo-w.webp博客订阅:https://duinew.com/rss.xml
hedp hedp 没看懂
bingo bingo 直接生成就可以啦,也可以添加一些选项
热评文章
夸克网盘快传助手提高非VIP下载速度

夸克网盘快传助手提高非VIP下载速度

夸克网盘限速这个大家都知道,不开会员差不多限速在几百 K。那有没有办法在合法合规途径加速下载夸克网盘呢?这里推...
Short-Link 免费开源短网址程序,基于Fastify、Vercel和Supabase构建

Short-Link 免费开源短网址程序,基于Fastify、Vercel和Supabase构建

Short-Link 是一款基于 Fastify、Vercel 和 Supabase 构建的 URL 缩短服务...
清华大学官方免费DeepSeek教程

清华大学官方免费DeepSeek教程

AI 领域近期最引人注目的焦点当属 DeepSeek,这款由中国创新企业深度求索研发的人工智能工具,正以开放源...
Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 是一款在线中文姓名生成器,可在几秒内生成符合个人需求的中文名字。...
2026年2月 每日精选

2026年2月 每日精选

关于每日精选栏目 发现一些不错的资源,点击 这里 快速投稿。 2 月 17 日 国家全民健身信息服务平台 过年...
DrawLink:一键生成链接视觉卡片,提升分享点击率

DrawLink:一键生成链接视觉卡片,提升分享点击率

小贴士 :此站或已变迁,但探索不止步。我们已为您备好「类似网站」精选合集,相信其中的发现同样能为您带来惊喜。
WebRTC Screen Mirror:基于浏览器免费开源投屏神器,可实现低延迟、跨平台屏幕共享

WebRTC Screen Mirror:基于浏览器免费开源投屏神器,可实现低延迟、跨平台屏幕共享

WebRTC Screen Mirror 是一款基于 WebRTC 技术的在线屏幕共享工具,它利用浏览器内置的...